package com.study.entity;

import lombok.Data;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

import javax.persistence.*;
import java.util.Date;

@Data
@Entity
@Table(name = "bus_receiver")
@Cacheable //Spring 在执行 @Cacheable 标注的方法前先查看缓存中是否有数据，如果有数据，则直接返回缓存数据；若没有数据，执行该方法并将方法返回值放进缓存。
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
/*
在使用 jpa 的 findById方法进行查询和 save进行更新数据的时候，hibernate 就会使用到缓存了 .
根据属性来查询是不使用缓存
 */
/*
Hibernate 缓存中 @Cache 的 CacheConcurrencyStrategy 的五种缓存方式
1、CacheConcurrencyStrategy.NONE
2、CacheConcurrencyStrategy.READ_ONLY
简介说明：只读模式，在此模式下，如果对数据进行更新操作，会有异常；
使用情景：对于不发生改变的数据使用
3、CacheConcurrencyStrategy.READ_WRITE
简介说明：读写模式在更新缓存的时候会把缓存里面的数据换成一个锁，其它事务如果去取相应的缓存数据，发现被锁了，直接就去数据库查询；
使用情景：基于时间戳判定机制，对于数据同步要求严格的情况，使用频繁；
4、CacheConcurrencyStrategy.NONSTRICT_READ_WRITE
简介说明：不严格的读写模式则不会的缓存数据加锁；
使用情景：更新不频繁几个小时或更长
5、CacheConcurrencyStrategy.TRANSACTIONAL
简介说明：事务模式指缓存支持事务，当事务回滚时，缓存也能回滚，只支持 JTA 环境。
 */
public class BusReceiverEntity {

    //主键
    @Id
    @Column(name="id")
    private Long id;

    //姓名
    @Column(name="name",length = 32)
    private String name;
    //区域
    @Column(name="region_code")
    private String regionCode;
    //地址
    @Column(name="address")
    private String address;


//    //地址英文名字
//    @Column(name="enname")
//    private String enName;
//    //家庭成员
//    @Column(name="memberfamily")
//    private int memberFamily;
//    //创建时间
//    @Column(name="create_date")
//    private Date createDate;

}